using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.Alf.Site.Entidades;

namespace MakeIT.Alf.Site.Negocios
{
	public partial class AlfDAO : DAO
	{

		public static EstadoVO getEstado(int? idEstado, string sigla, string estado)
		{
			EstadoVO estadoVO = null;
			List<EstadoVO> listEstadoVOs = getEstados(idEstado, sigla, estado);
			if (listEstadoVOs != null && listEstadoVOs.Count > 0)
			{
				estadoVO = listEstadoVOs[0];
			}
			return estadoVO;
		}

		public static EstadoVO getEstado(int? idEstado)
		{
			return getEstado(idEstado, null, null);
		}

		public static List<EstadoVO> getEstados()
		{
			return getEstados(null, null, null);
		}

		public static List<EstadoVO> getEstados(int? idEstado)
		{
			return getEstados(idEstado, null, null);
		}

		public static List<EstadoVO> getEstados(int? idEstado, string sigla, string estado)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT uf.idEstado as uf_idEstado, uf.sigla as uf_sigla, uf.estado as uf_estado, uf.Cadastro as uf_Cadastro, uf.CadastradoPor as uf_CadastradoPor, uf.Edicao as uf_Edicao, uf.EditadoPor as uf_EditadoPor  ");
			query.AppendLine("FROM estado as uf ");
			if (idEstado != null)
			{
				query.AppendLine(where + "uf.idEstado=@idEstado ");
				where = "AND ";
			}
			if (sigla != null)
			{
				query.AppendLine(where + "uf.sigla LIKE @sigla ");
				where = "AND ";
			}
			if (estado != null)
			{
				query.AppendLine(where + "uf.estado LIKE @estado ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY uf.sigla, uf.estado ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idEstado!= null) cmd.Parameters.Add(getParameter(cmd, "@idEstado", idEstado));
			if (sigla!= null) cmd.Parameters.Add(getParameter(cmd, "@sigla", "%"+sigla+"%"));
			if (estado!= null) cmd.Parameters.Add(getParameter(cmd, "@estado", "%"+estado+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<EstadoVO> listEstado = new List<EstadoVO>();

				while (reader.Read())
				{
					EstadoVO estadoVO = EstadoVO.CreateVO();
					estadoVO.idEstado = reader.GetInt32(reader.GetOrdinal("uf_idEstado"));
					estadoVO.sigla = reader.GetString(reader.GetOrdinal("uf_sigla"));
					estadoVO.estado = reader.GetString(reader.GetOrdinal("uf_estado"));
					estadoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("uf_Cadastro"));
					estadoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("uf_CadastradoPor"));
					estadoVO.edicao = reader.GetDateTime(reader.GetOrdinal("uf_Edicao"));
					estadoVO.editadoPor = reader.GetString(reader.GetOrdinal("uf_EditadoPor"));


					listEstado.Add(estadoVO);
				}
				reader.Close();
				return listEstado;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }
		}

		public static void setEstado(EstadoVO estadoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE estado ");
			query.AppendLine("SET sigla=@sigla, estado=@estado,  Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idEstado=@idEstado ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idEstado", estadoVO.idEstado));
			cmd.Parameters.Add(getParameter(cmd, "@sigla", estadoVO.sigla));
			cmd.Parameters.Add(getParameter(cmd, "@estado", estadoVO.estado));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", estadoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", estadoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", estadoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", estadoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static long newEstado(EstadoVO estadoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO estado ");
			query.AppendLine("  ( sigla, estado, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @sigla, @estado, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@sigla", estadoVO.sigla));
			cmd.Parameters.Add(getParameter(cmd, "@estado", estadoVO.estado));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", estadoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", estadoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", estadoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", estadoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('estado') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}

		public static void delEstado(EstadoVO estadoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM estado ");
			query.AppendLine("WHERE idEstado=@idEstado ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idEstado", estadoVO.idEstado));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }
            finally
            {
                if (cmd != null && cmd.Connection != null)
                    cmd.Connection.Close();
            }

		}
	}
}
